#include <iostream>
#include <cstring>
using namespace std;

/*
    string常用的方法
        追加字符串 append()
        赋值字符串 aassign()
        获取下标对应的字符 at()
        获取末尾的字符 back()
        获取开头的字符 front()
        将string对象转换成char* c_str()
        清空字符串 clear()
        获取字符串长度 size()
        获取字符串长度 length()
        获取字符串的指针 data()
        判断字符串是否为空 empty()
        删除字符串 erase()
        查找字符串 find()
        插入字符串 insert()
        删除最后一个字符 pop_back()
        替换字符串 replace()
        截取字符串 substr()
        交换字符串 swap()

*/

int main()
{
    string str1 = "hello";
    string str2 = "world";
    // 追加字符串
    // str1.append(str2);       // 在str1 后面追加str2
    // str1.append(12, 'g'); // 追加字符串, 追加12个s
    str1.append(str2, 1, 2); // 追加字符串、下标、长度  (追加or)
    cout << "str1 = " << str1 << endl;

    // 赋值字符串
    str2.assign("yuj"); // 将yuj赋值给str2 会将str2原本的内容清空
    cout << "str2 = " << str2 << endl;

    // 获取下标对应的字符
    cout << "str1下标为3的字符 = " << str1.at(3) << endl;
    str1.at(3) = '@'; // 修改下标为3的字符
    cout << "str1 = " << str1 << endl;

    // 获取末尾的字符
    cout << "str1末尾的字符 = " << str1.back() << endl;

    // 获取开头的字符
    cout << "str1开头的字符 = " << str1.front() << endl;

    // 将string对象转换成char*
    const char *p = str1.c_str();
    cout << "p = " << p << endl;

    // 清空字符串
    str2.clear();
    cout << "str2 = " << str2 << endl;

    // 获取字符串长度
    cout << "str1长度 = " << str1.size() << endl;
    cout << "str1长度 = " << str1.length() << endl;

    // 获取字符串的指针
    const char *p2 = str1.data();
    cout << "p2 = " << &p2 << endl;

    // 判断字符串是否为空
    cout << "str1是否为空: " << str1.empty() << endl;
    cout << "str2是否为空: " << str2.empty() << endl;

    // 删除字符串
    str1.erase(3, 1); // 删除从下标3开始长度为1的字符串
    cout << "str1 = " << str1 << endl;

    // 查找字符串
    cout << "字符o的下标是:" << str1.find("o") << endl; // 查找字符串首次出现的位置
    cout << str1.find("lo", 1, 2) << endl;              // 找到从下标1开始长度为2的字符串
    size_t pos = str1.find("x");
    // string::npos == -1 | 18446744073709551615表示string::npos
    if (pos == string::npos)
    {
        cout << "未找到" << endl;
    }
    
    // 插入字符串
    cout << "插入前的字符串" << "str1 = " << str1 << endl;
    // str1.insert(3, "abc"); // 在下标3处插入abc
    // str1.insert(3, "abc", 2); // 在下标3处插入abc, 插入2个字符
    str1.insert(3, "abc", 2, 3); // 在下标3处插入abc, 插入下标开始为2,结尾为3的字符
    cout << "插入后的字符串" << "str1 = " << str1 << endl;

    // 删除最后一个字符
    str1.pop_back();
    cout << "str1 = " << str1 << endl;

    // 在末尾添加一个字符(只能是一个)
    str1.push_back('a');
    cout << "str1 = " << str1 << endl;

    // 替换字符串
    str1.replace(3, 1, "ggg"); // 从下标3开始替换长度为1的字符串为ggg
    cout << "str1 = " << str1 << endl;

    // 截取字符串   原本的字符串不改变
    string str3 = str1.substr(3, 2); // 从下标3开始截取2个字符
    cout << "str3 = " << str3 << endl;
    cout << "str1 = " << str1 << endl;

    // 交换字符串
    str1.swap(str3);
    cout << "str1 = " << str1 << endl;
    cout << "str3 = " << str3 << endl;

    return 0;
}